package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.dao.UserDao;
import com.itheima.health.pojo.Role;
import com.itheima.health.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.MenuDao;
import com.itheima.health.dao.PermissionDao;

import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;

import com.itheima.health.pojo.Menu;
import com.itheima.health.pojo.Permission;

import org.springframework.web.bind.annotation.RequestBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author weizhongli
 * @Date 2020/4/15
 * @Version v1.0
 * @Description 角色业务接口实现类
 **/
@Service
public class RoleServiceImpl implements RoleService {

    //依赖注入dao
    @Autowired
    private RoleDao roleDao;
    @Autowired
    private PermissionDao permissionDao;
    @Autowired
    private MenuDao menuDao;
    @Autowired
    private UserDao userDao;


    /*
     * 分页查询
     * */
    @Override
    public PageResult pageQuery(@RequestBody QueryPageBean queryPageBean) {
        //设置分页插件初始参数
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //通过Dao获取Page对象
        Page<Role> page = roleDao.selectByCondition(queryPageBean.getQueryString());
        //通过Page对象，构建PageResult
        PageResult pageResult = new PageResult(page.getTotal(), page.getResult());

        return pageResult;
    }

    /*
     * 查询所有权限
     * */
    @Override
    public List<Permission> findAllPermission() {

        return permissionDao.findAllPermission();
    }


    /*
     * 查询所有菜单
     * */
    @Override
    public List<Menu> findAllMenu() {
        return menuDao.findAllMenu();
    }

    /*
     * 添加角色
     * */
    @Override
    public void add(Role role, Integer[] menuIds, Integer[] permissionIds) {
        //保存新增的角色信息
        roleDao.add(role);
        //保存新增角色 与 勾选的菜单 , 保存到中间表里 t_role_menu
        //遍历菜单Id的数组, 得到每一个菜单id
        for (Integer menuId : menuIds) {
            //创建Map集合 用于存储本次sql语句的 新增角色id 与 当前的菜单Id
            Map<String, Integer> map = new HashMap<>();
            map.put("role_id", role.getId());
            map.put("menu_id", menuId);

            //把新增角色id 与 当前的菜单Id 保存到中间表
            roleDao.addroleAndmenu(map);
        }

        //保存新增角色 与 勾选的权限 , 保存到中间表里 t_role_permission
        //遍历权限Id的数组, 得到每一个权限id
        for (Integer permissionId : permissionIds) {
            //创建Map集合 用于存储本次sql语句的 新增角色id 与 当前的菜单Id
            Map<String, Integer> map1 = new HashMap<>();
            map1.put("role_id", role.getId());
            map1.put("permission_id", permissionId);

            //把新增角色id 与 当前的菜单Id 保存到中间表
            roleDao.addroleAndpermission(map1);
        }
    }

    /*
     *  根据ID获取角色数据
     * */
    @Override
    public Role findById(Integer id) {
        return roleDao.findById(id);
    }

    /*
     * 根据角色ID获取选中的菜单列表id
     * */
    @Override
    public List<Integer> findmenuIdsByRoleId(Integer id) {
        return roleDao.findmenuIdsByRoleId(id);
    }

    /*
     * 根据角色ID获取选中的权限列表id
     * */
    @Override
    public List<Integer> findPermissionIdsByRoleId(Integer id) {
        return roleDao.findPermissionIdsByRoleId(id);
    }

    /*
     * 编辑角色
     * */
    @Override
    public void edit(Role role, Integer[] menuIds, Integer[] permissionIds) {
        //更新角色信息
        roleDao.edit(role);
        //删除角色 旧的依赖关系( 角色与勾选的菜单的关系 [从中间表删除数据] )
        roleDao.deleteRoleAndmenu(role.getId());
        //重新 建立新的角色的依赖关系( 角色与勾选的菜单的关系[从中间表添加数据] )
        for (Integer menuId : menuIds) {
            //创建Map集合 用于存储本次sql语句的 新增角色id 与 当前的菜单Id
            Map<String, Integer> map = new HashMap<>();
            map.put("role_id", role.getId());
            map.put("menu_id", menuId);

            //把新增角色id 与 当前的菜单Id 保存到中间表
            roleDao.addroleAndmenu(map);
        }

        //删除角色 旧的依赖关系( 角色与勾选的权限的关系 [从中间表删除数据] )
        roleDao.deleteRoleAndpermission(role.getId());
        //重新 建立新的角色的依赖关系( 角色与勾选的权限的关系[从中间表添加数据] )
        for (Integer permissionId : permissionIds) {
            //创建Map集合 用于存储本次sql语句的 新增角色id 与 当前的菜单Id
            Map<String, Integer> map1 = new HashMap<>();
            map1.put("role_id", role.getId());
            map1.put("permission_id", permissionId);

            //把新增角色id 与 当前的菜单Id 保存到中间表
            roleDao.addroleAndpermission(map1);
        }
    }

    /*
     * 删除角色
     * */
    @Override
    public void delete(Integer id) {
        //判断当前检查项 在中间表中 是否被引用
        int count1 = roleDao.findCountInroleAndmenu(id);
        int count2 = roleDao.findCountInroleAndpwemission(id);

        if (count1 > 0 || count2 > 0) {
            throw new RuntimeException("该角色在中间表中引用  不能删除");
        }

        roleDao.delete(id);
    }

/*

* 获取角色信息
* mashuaiyong
* */
    @Override
    public Role findId(String username) {
        Integer uid = userDao.findByUsername(username).getId();
        Role role =   roleDao.findId(uid);
        return role;
}
}
